/**
 * 
 */
package Proj1;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 * Turma da escola
 * @author Leonardo e Mikaelle
 * 
 */
public class Turma {
	/**
	 * Nome da turma
	 */
	private String nome;
	/**
	 * Nome do professor responsavel pela turma
	 */	
	private Professor professor;
	/**
	 * Lista dos alunos pertencentes a turma
	 */
	private ArrayList<Aluno> alunos;

	/**
	 * Pega o nome da turma
	 * 
	 * @return nome
	 */
	public String getNome(String nome) {
		return nome;
	}

	/**
	 * Altera o nome da turma
	 * 
	 * @param nome
	 *            Nome da turma
	 * @return true Se o nome da turma for alterado com sucesso caso contrario
	 *         retorna false.
	 */
	public boolean setNome(String orig_nome, String nov_nome) {
		return BancoDeDados.queryUpdate("update turmas set nome = "+nov_nome+" where nome = "+orig_nome);
	}

	/**
	 * Pega o nome do professor responsavel pela turma
	 * 
	 * @return professor
	 * @throws SQLException 
	 */
	public Professor getProfessor(String curso) throws SQLException {
		ResultSet res = BancoDeDados.query("select professor from turmas where curso = "+curso);
		int matricula = -1;
		while(res.next()){
			matricula = res.getInt("professor");
		}
		res = BancoDeDados.query("select p.matricula, p.nome, p.endereco from professore p where matricula = "+matricula);
		Professor professor = null;
		while(res.next()){
			professor = new Professor(res.getInt("matricula"), res.getString("nome"), res.getString("endereco"));
		}
		return professor;
	}

	/**
	 * Altera o nome do professor responsavel pela turma
	 * 
	 * @param professor
	 *            Professor responsavel
	 * @return true Se o professor for alterado com sucesso caso contrario
	 *         retorna false.
	 */
	public boolean setProfessor(int ant_matricula, int nov_matricula) {
		return BancoDeDados.queryUpdate("update from Turma professor = '"+nov_matricula+"' where professor = "+ant_matricula);
	}

	/**
	 * Pega a lista de alunos matriculados na turma
	 * 
	 * @return alunos
	 * @throws SQLException 
	 */
	public ArrayList<Aluno> getAlunos(String turma) throws SQLException {
		ResultSet res = BancoDeDados.query("select a.matricula, a.nome, a.endereco from alunos a, alunos_turmas at where a.matricula = at.alunos_turmas and at.turma = "+turma);
		alunos = new ArrayList<Aluno>();
		while(res.next()){
			Aluno aluno = new Aluno(res.getInt("matricula"), res.getString("turma"), res.getString("endereco"));
			alunos.add(aluno);
		}
		return alunos;
	}


	/**
	 * Metodo para adicionar um novo aluno a turma
	 * 
	 * @param aluno
	 *            Objeto alunos
	 * @return true Se o aluno for valido ele sera adicionado a turma caso
	 *         contrario retorns false.
	 * @throws SQLException 
	 */
	public boolean addAluno(String turma, String matricula) throws SQLException {
		PreparedStatement pstm = BancoDeDados.getConexao().prepareStatement("insert into alunos_turmas (turma, Aluno) values (?, ?)");		
		pstm.setString(1, turma);
		pstm.setString(2, matricula);
		pstm.executeUpdate();
		return true;
		//return BancoDeDados.queryUpdate("insert into alunos_cursos (turma, aluno) set ('"+turma+"', '"+matricula+"')"); 
	}
/**
 * Metodo para procurar um aluno na turma passada sua matricula
 * @param matricula Matricula do aluno
 * @return res
 * @throws SQLException 
 */
	public Aluno procAluno(String turma, String matricula) throws SQLException {
		ResultSet res = BancoDeDados.query("select a.matricula, a.nome, a.endereco from alunos a, alunos_turmas at where a.matricula = '"+matricula+"' and at.tuma = '"+turma);
		Aluno aluno = null;
		while(res.next()){
			aluno = new Aluno(res.getInt("matricula"), res.getString("nome"), res.getString("endereco"));
		}
		return aluno;
	}

	/**
	 * Remove um aluno da turma passada uma matricula
	 * 
	 * @param matricula
	 *            Matricula do aluno
	 * @return true Se a matricula for valida caso contrario retorna false.
	 */
	public boolean removeAluno(String matricula) {
		return BancoDeDados.queryUpdate("delete from alunos_curso where aluno = "+matricula);
	}

	/**
	 * Construutor default da classe turma.
	 */
	public Turma() {
		super();
		this.alunos = new ArrayList<Aluno>();
	}

	/**
	 * Construtor explicito da classe turma
	 */
	public Turma(String nome, Professor professor) {
		super();
		this.nome = nome;
		this.professor = professor;
		this.alunos = new ArrayList<Aluno>();
	}
	
	public Turma(String nome, String professor) {
		super();
		this.nome = nome;
		this.professor.setNome(professor);
		this.alunos = new ArrayList<Aluno>();
	}
}
